package com.linzm.leetcode.primary.exercises1_20230114;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author zimingl
 * @Date 2023/1/15 19:56
 * @Description: 构造矩形
 * 作为一位web开发者， 懂得怎样去规划一个页面的尺寸是很重要的。 所以，现给定一个具体的矩形页面面积，你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求：
 * 你设计的矩形页面必须等于给定的目标面积。
 * 宽度 W 不应大于长度 L ，换言之，要求 L >= W 。
 * 长度 L 和宽度 W 之间的差距应当尽可能小。
 * 返回一个 数组 [L, W]，其中 L 和 W 是你按照顺序设计的网页的长度和宽度。
 */
public class Demo24_492 {
    /**
     * 输入: 4
     * 输出: [2, 2]
     * 解释: 目标面积是 4， 所有可能的构造方案有 [1,4], [2,2], [4,1]。
     * 但是根据要求2，[1,4] 不符合要求; 根据要求3，[2,2] 比 [4,1] 更能符合要求. 所以输出长度 L 为 2， 宽度 W 为 2。
     */
    public static void main(String[] args) {
        Demo24_492 demo24_492 = new Demo24_492();
//        int area = 4;
//        int area = 122122;
        int area = 2;
        int[] ints = demo24_492.constructRectangle(area);
        String[] strings = Arrays.stream(ints).mapToObj(String::valueOf).toArray(String[]::new);
        System.out.println(String.join(" ", strings));
    }

    private int[] constructRectangle(int area) {
        // 4-2,2 4,1 37-37,1 122122-122122,1
        int right = area, min = Integer.MAX_VALUE;
        int[] res = new int[2];
        for (int left = 1; left <= right; left++) {
            right = area / left;
            if (right * left == area && right >= left) {
                int[] nums = new int[2];
                nums[0] = right;
                nums[1] = left;
                if (right - left < min) {
                    res = Arrays.copyOf(nums, 2);
                }
            }
        }
        return res;
    }

    private int[] constructRectangle2(int area) {
        List<int[]> list = new ArrayList<>();
        int right = area;
        for (int left = 1; left <= right; left++) {
            right = area / left;
            if (right * left == area && right >= left) {
                int[] nums = new int[3];
                nums[0] = right;
                nums[1] = left;
                nums[2] = right - left;
                list.add(nums);
            }
        }
        List<int[]> resList = list.stream().sorted(Comparator.comparingInt(arr -> arr[2])).collect(Collectors.toList());
        int[] res = new int[2];
        res[0] = resList.get(0)[0];
        res[1] = resList.get(0)[1];
        return res;
    }
}
